package com.lin.cloud.disk.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberUtils {
	
	/**
	 * 生成随机randNum位数---随机密码用的
	 * @return
	 */
	public static String getRandom(int randNum){
		Random r = new Random();
		return getNumStr(String.valueOf(r.nextInt() * 10),randNum);
	}
	public static String getNumStr(String numStr,int randNum){
		StringBuffer sbSysTrace = new StringBuffer("000000").append(numStr);
		String systrace = sbSysTrace.substring(sbSysTrace.length() - randNum,sbSysTrace.length());
		return systrace;
	}
	
	 /**
     * 获取某范围内的随机整数
     *
     * @param min
     * @param max
     * @return
     */
    public static int getIntRandom(int min, int max) {
        Random random = new Random();
        return random.nextInt(max) % (max - min + 1) + min;
    }
	
	public static int str2Integer(String numStr){
		int num = 0;
		try{
			num = Integer.valueOf(numStr.trim());
		}catch(Exception e){
			num = 0;
		}
		return num;
	}
	
	/**
	 * 获取两个数的百分比
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String getPercentFormat(int num1,int num2){
		// 创建一个数值格式化对象  
        NumberFormat numberFormat = NumberFormat.getInstance();  
        // 设置精确到小数点后2位  
        numberFormat.setMaximumFractionDigits(2);  
        String result = numberFormat.format((float) num1 / (float) num2 * 100);  
//        System.out.println("num1和num2的百分比为:" + result + "%");
        return result;
	}
	
	public static double getPriceFormat(double price){
		BigDecimal b = new BigDecimal(price);  
		double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return f1;
	}
	
	/**
	 * 默认保留2位小数
	 * @param price
	 * @return
	 */
	public static float getPriceFormat(float price){
		return getPriceFormat(price,2);
	}
	
	/**
	 * 
	 * @param price
	 * @param scale   几位小数
	 * @return
	 */
	public static float getPriceFormat(float price,int scale){
		BigDecimal b = new BigDecimal(price);  
		float f1 = b.setScale(scale, BigDecimal.ROUND_HALF_UP).floatValue();
		return f1;
	}
	
	/**
	 * a pseudorandom double greater than or equal to 0.0 and less than 1.0. 
		即返回一个[0,1)的double类型的随机数
		以下情况 |　y>x
		double随机数
		
		要获取一个[x,y)的double类型的随机数 | 左闭右开
		double d = x + Math.random() * (y - x);
		
		要获取一个(x,y]的double类型的随机数 | 左开右闭
		double d = y - Math.random() * (y - x);
		
		要获取一个[x,y]的double类型的随机数 | 左闭右闭
		double d = x + Math.random() * y % (y - x + 1);
		
		要获取一个(x,y)的double类型的随机数 | 左开右开
		double d = (y - Math.random()) % y;

	 * @param min
	 * @param max
	 * @return
	 */
	public static double getRandomDouble(int min,int max){
		double d = min + Math.random() * max % (max - min + 1);
		return d;
	}
	
	public static double getRandomDouble(double min,double max){
		double d = min + Math.random() * max % (max - min + 1);
		return d;
	}
	
	public static float getRandomFloat(float min,float max){
		float d = (float) (min + Math.random() * max % (max - min + 1));
		return d;
	}
	
	/**
	 * 获取范围内随机数
	 * @param min
	 * @param max
	 * @return
	 */
	public static int getRandom(int min,int max){
        Random random = new Random();
        int num = random.nextInt(max)%(max-min+1) + min;
		return num;
	}
	
	public static boolean isNumeric(String str){
      Pattern pattern = Pattern.compile("[0-9]*");
      Matcher isNum = pattern.matcher(str);
      return isNum.matches();
	}
	
	
	/**
	 * 元转分
	 * @param price  8.86  - > 886
	 * @return
	 */
	public static long yuanToFen(String price){
		return (long) (Double.valueOf(price) * 100);
	}

	public static int doubleToInt(String rate){
		double d = Double.valueOf(rate);
		return (int) d;
	}

	/**
	 * 元转分，确保price保留两位有效数字
	 * @return
	 */
	public static int changeY2F(double price) {
		DecimalFormat df = new DecimalFormat("#.00");
		Integer money = new BigDecimal(df.format(price)).multiply(new BigDecimal(100)).intValue();
		return money;
	}

	/**
	 * 元转分，确保price保留两位有效数字 Long类型
	 * @return
	 */
	public static Long changeY2FToLong(double price) {
		DecimalFormat df = new DecimalFormat("#.00");
		Long money = new BigDecimal(df.format(price)).multiply(new BigDecimal(100)).longValue();
		return money;
	}

    /**
     * 分转元，转换为bigDecimal在toString
     * @return
     */
    public static String changeF2Y(int price) {
        return BigDecimal.valueOf(Long.valueOf(price)).divide(new BigDecimal(100)).toString();
    }

	/**
	 * 分转元，转换为bigDecimal在toString 留2位小数
	 * @param price
	 * @return
	 */
	public static String changeF2Y2Point(int price){
		return NumberUtils.changeF2Y2Point(Long.valueOf(price));
	}

	/**
	 * 分转元，转换为bigDecimal在toString 留2位小数
	 * @param price
	 * @return
	 */
	public static String changeF2Y2Point(long price){
		return BigDecimal.valueOf(price).divide(new BigDecimal(100),2, RoundingMode.HALF_UP).toString();
	}

	
}
